<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>3.姓名案例_计算属性实现</title>
		<style>
			*{
				margin-top: 10px;
			}
		</style>
		<!-- 引入Vue -->
		<script type="text/javascript" src="../js/vue.js"></script>
	</head>
	<body>
		<!-- 
				计算属性：
						1.定义：要用的属性（数据）不存在，要根据已有属性（数据）计算得来。

						2.关于get函数
									get函数何时调用？
											(1).初次读取fullName时会调用。
											(2).当计算fullName所依赖的数据发生改变时会被再次调用。
									get函数中的this是vm。

						3.关于set函数
									set函数何时调用？仅当计算属性被修改时
									啥叫修改计算属性？这叫修改：this.fullName = '李-四'
									set函数中的this是vm。

						4.原理：底层通过Objcet.defineproperty实现的。

						5.优势：与methods实现相比，内部有缓存机制（复用），效率更高，且调试方便。

						6.备注：
									(1).计算属性最终会出现在vm上，在模板中可直接使用即可
									(2).如果计算属性后期要被修改，那必须写set函数（setter）去响应修改。

		 -->
		<!-- 准备好一个容器-->
		<div id="demo">
			学校名：<input type="text" v-model="schoolName"> <br>
			姓：<input type="text" v-model="firstName"> <br>
			名：<input type="text" v-model="lastName"> <br>
			全名：<span>{{fullName}}</span> <br> 
			<button @click="changeFullName">把全名改成：李-四</button>
		</div>

		<script type="text/javascript">
			//阻止 vue 在启动时生成生产提示。
			Vue.config.productionTip = false
			
			let vm = new Vue({
				el:'#demo',
				//data中的叫：属性(数据)
				data:{
					schoolName:'尚硅谷',
					firstName:'张',
					lastName:'三'
				},
				methods:{
					changeFullName(){
						// this.firstName = '李' //修改属性，会引起计算属性重新计算（getter调用）。
						// this.lastName = '四' //修改属性，会引起计算属性重新计算（getter调用）。
						this.fullName = '李-四' //修改计算属性，会引起setter的调用。
					}
				},
				//computed中的叫：计算属性(计算数据)
				computed:{
					fullName:{
						/* 
							get函数（getter）何时会调用？
									1.初次读取fullName时会执行。
									2.当计算fullName所依赖的数据发生改变时会被再次调用
							get函数（getter）中的this是vm
						*/
						get(){
							// console.log('计算属性fullName对应的getter调用了！')
							return this.firstName + '-' + this.lastName
						},
						set(val){
							// console.log('计算属性fullName对应的setter调用了！,我收到了新的值:',val)
							let arr = val.split('-')
							this.firstName = arr[0]
							this.lastName = arr[1]
						}
					}
				}
			})

		</script>
	</body>
</html>